package br.com.bestOffer.ejb.discoRigido.service;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.bestOffer.ejb.discoRigido.entity.DiscoRigido;
import br.com.bestOffer.ejb.vo.DiscoRigidoVo;
import br.com.bestOffer.enumerator.CategoriaProduto;
import br.com.bestOffer.exceptions.BestOfferDadoNaoEncontradoException;
import br.com.bestOffer.exceptions.BestOfferListaVaziaException;
import br.com.bestOffer.exceptions.BestOfferPersistenceException;

@Stateless
public class DiscoRigidoServiceBean {
	
	private static final String DISCO_RIGIDO_SERVICE_BEAN = "discoRigidoServiceBean";

	@PersistenceContext
	private EntityManager entityManager;
	
	public void cadastrarDisco(DiscoRigido disco) throws BestOfferPersistenceException{
		try {
			entityManager.persist(disco);
		} catch (Exception e) {
			throw new BestOfferPersistenceException(DISCO_RIGIDO_SERVICE_BEAN, "Erro ao incluir o Disco", e);
		}
	}
	
	public void alterarDisco(DiscoRigido disco) throws BestOfferPersistenceException{
		try {
			entityManager.merge(disco);
		} catch (Exception e) {
			throw new BestOfferPersistenceException(DISCO_RIGIDO_SERVICE_BEAN, "Erro ao alterar o Disco", e);
		}
	}
	
	public void excluirDisco(DiscoRigido disco) throws BestOfferPersistenceException{
		try {
			DiscoRigido discoRigido = entityManager.find(DiscoRigido.class, disco.getId());
			entityManager.remove(discoRigido);
		} catch (Exception e) {
			throw new BestOfferPersistenceException(DISCO_RIGIDO_SERVICE_BEAN, "Erro ao excluir o Disco", e);
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<DiscoRigido> listarTodosDiscos() throws BestOfferListaVaziaException{
		try {
			Query query = entityManager.createNamedQuery("DiscoRigido.listarTodosDiscoRigidos");
			return query.getResultList();
		} catch (Exception e) {
			throw new BestOfferListaVaziaException(DISCO_RIGIDO_SERVICE_BEAN, "Erro ao Listar", e);
		}
	}
	
	
	public DiscoRigido buscarDiscoRigido(Integer id) throws BestOfferDadoNaoEncontradoException{
		try {
			Query query = entityManager.createNamedQuery("DiscoRigido.buscarDiscoRigidoPorID").setParameter("idProduto", id);
			return (DiscoRigido) query.getSingleResult();
		} catch (Exception e) {
			throw new BestOfferDadoNaoEncontradoException(DISCO_RIGIDO_SERVICE_BEAN, "Nenhum dado encontrado", e);
		}
	}
	
	public DiscoRigido buscarDiscoRigidoComAnuncios(Integer id) throws BestOfferDadoNaoEncontradoException{
		try {
			Query query = entityManager.createNamedQuery("DiscoRigido.buscarDiscoRigidoPorIDComAnuncios").setParameter("idProduto", id);
			return (DiscoRigido) query.getSingleResult();
		} catch (Exception e) {
			throw new BestOfferDadoNaoEncontradoException(DISCO_RIGIDO_SERVICE_BEAN, "Nenhum dado encontrado", e);
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<DiscoRigidoVo> pesquisarDiscoRigido(String idFabricante,String modelo){
		StringBuilder q = new StringBuilder();
		q.append(" SELECT NEW br.com.bestOffer.ejb.vo.DiscoRigidoVo( disco , anuncio ) FROM Anuncio anuncio , DiscoRigido disco where disco.id = anuncio.id.produto.id and anuncio.status = 1");

		
		if (idFabricante != null && !"".equals(idFabricante)){
			q.append(" AND d.fabricante.id = :idFabricante ");
		}
		
		if (modelo != null && !"".equals(modelo)){
			q.append(" AND d.modelo LIKE :modelo ");
		}	
		
		Query query = entityManager.createQuery(q.toString());
		
		query.setParameter("categoria", CategoriaProduto.DiscoRigido);
		
		if (idFabricante != null && !"".equals(idFabricante)){
			query.setParameter("idFabricante", Integer.valueOf(idFabricante));
		}
		
		if (modelo != null && !"".equals(modelo)){
			query.setParameter("modelo","%" + modelo.trim() + "%");
		}
		
		return query.getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<DiscoRigidoVo> listarDiscoRigidoVo(){
		try {
			StringBuilder q = new StringBuilder();
			q.append(" SELECT NEW br.com.bestOffer.ejb.vo.DiscoRigidoVo( disco , anuncio ) FROM Anuncio anuncio , DiscoRigido disco where disco.id = anuncio.id.produto.id and anuncio.status = 1");

			Query query = entityManager.createQuery(q.toString());
			return query.getResultList();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
